<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>构造函数继承</title>
</head>
<body>
    <script>
        // 构造函数继承：在子类构造函数中调用父类构造函数，可以在子类构造函数中使用call()和apply()方法
        function Parent() {
            this.info = {
                name: 'Katrina', 
                age: 18, 
            };
        };

        function Child() {
            Parent.call(this);
        };

        /*
            通过使用call()或apply()方法，Parent构造函数在为Child的实例创建的新对象的上下文执行了，
            就相当于新的Child实例对象上运行了Parent()函数中的所有初始化代码，结果就是每个实例都有自己的info属性
        */


        let c1 = new Child();
        c1.info.gender = 'female';
        console.log(c1.info);   // {name: 'Katrina', age: 18, gender: 'female'};

        let c2 = new Child();
        console.log(c2.info);   // {name: 'Katrina', age: 18};


        /*
            相比于原型链继承，盗用构造函数的一个优点在于可以在子类构造函数中相父类构造函数传递参数
        */

        function Parent1(name) {
            this.info = {
                name: name, 
            };
        };

        function Child1(name) {
            // 继承自父类，并传参
            Parent1.call(this, name);

            // 实例属性
            this.age = 18;
        };

        let c3 = new Child1('xiaoKa');
        console.log(c3.info.name); // 'xiaoKa'

    </script>
</body>
</html>